package main

import (
	"fmt"
	"time"
)

func main() {
	// 1. 获取当前时间
	now := time.Now()
	fmt.Println("Now:", now) // 2025-06-25 15:04:05.123456789 +0800 CST

	// 2. 只保留日期 / 零时钟点
	today := now.Truncate(24 * time.Hour) // 当天 00:00:00
	fmt.Println("Today:", today)

	// 3. 构造指定日期
	t := time.Date(2025, 6, 25, 18, 30, 0, 0, time.Local)
	fmt.Println("Meeting:", t)

	// 4. 解析常用格式（必须记住的 2 个参考格式）
	//    2006-01-02 15:04:05 是 Go 的固定记忆基准
	dateStr := "2025-06-25"
	parseDate, _ := time.Parse("2006-01-02", dateStr)
	fmt.Println("Parsed date:", parseDate)

	dateTimeStr := "2025-06-25 18:30:05"
	parseDT, _ := time.Parse("2006-01-02 15:04:05", dateTimeStr)
	fmt.Println("Parsed datetime:", parseDT)

	// 5. 格式化输出
	fmt.Println("Format date:", now.Format("2006-01-02"))
	fmt.Println("Format time:", now.Format("15:04:05"))
	fmt.Println("Custom:", now.Format("Jan 2, 2006 (Mon)"))

	// 6. 时间运算
	yesterday := now.AddDate(0, 0, -1)
	fmt.Println("Yesterday:", yesterday.Format("2006-01-03"))
	nextHour := now.Add(1 * time.Hour)
	fmt.Println("Next hour:", nextHour.Format("15:04"))

	// 7. 时间差
	diff := now.Sub(t)
	fmt.Printf("距离会议还有 %.0f 分钟\n", diff.Minutes())

	// 8. 比较
	if now.After(t) {
		fmt.Println("会议已结束")
	} else {
		fmt.Println("会议未开始")
	}

	// 9. 获取年 / 月 / 日 / 周几
	y, m, d := now.Date()
	fmt.Printf("Year=%d Month=%d Day=%d\n", y, m, d)
	fmt.Println("Weekday:", now.Weekday()) // time.Monday ...

	// 10. 获取时 / 分 / 秒 / 纳秒
	h, min, sec := now.Clock()
	fmt.Printf("Clock %02d:%02d:%02d\n", h, min, sec)
	fmt.Println("Unix 时间戳 (秒):", now.Unix())
	fmt.Println("UnixMilli:", now.UnixMilli())
	fmt.Println("UnixMicro:", now.UnixMicro())
	fmt.Println("UnixNano:", now.UnixNano())

	// 11. 睡眠 / 定时器（简单示例）
	fmt.Print("Sleep 1 s ...")
	time.Sleep(1 * time.Second)
	fmt.Println("done")

	ticker := time.NewTicker(500 * time.Millisecond)
	defer ticker.Stop()
	go func() {
		for t := range ticker.C {
			fmt.Println("Tick at", t.Format("15:04:05"))
		}
	}()
	time.Sleep(2 * time.Second) // 让 ticker 跑 4 次
}

// | 对照   | 日常模板 | Go 固定模板 | 来源片段   |
// | ----- | ---- | ------- | ------ |
// | 年     | yyyy | 2006    | 2006 年 |
// | 月     | mm   | 01      | 1 月    |
// | 日     | dd   | 02      | 2 日    |
// | 时(24) | hh   | 15      | 15 时   |
// | 分     | mm   | 04      | 4 分    |
// | 秒     | ss   | 05      | 5 秒    |
// now.Format("2006-01-02 15:04:05") 相当于 now.Format("yyyy-mm-dd hh:mm:ss")

// 选 2006-01-02 15:04:05 纯粹是 Rob Pike 为了“好记” 而挑的一个普通时间点，核心原因是：
// 数字递增 1 2 3 4 5 6 7
// Jan(1) 2 15(3) 04(5) 05(6) 2006(7) -0700
// 秒-分-时-日-月-年-时区依次出现，方便开发者靠顺序就能拼出任意格式 。
